package org.ch02.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author lwj
 * @date 2025-03-17
 * @vesion 1.0.0
 */
public class BeanUtils {

    /**
     * 实例化任意对象
     * @param packageName 包名
     * @return 任意对象
     */
    public static Object createBean(String packageName){
        try{
            // 获取 Class 对象
            Class<?> clazz = Class.forName(packageName);
            // 获取构造对象
            Constructor<?> constructor = clazz.getConstructor();
            // 实例化对象
            Object object = constructor.newInstance();

            return object;
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

    /**
     * 调用指定的方法
     * @param packageName 包名
     * @param methodName 方法名
     * @param paramTypes 类型.class
     * @param params 参数信息
     * @return 调用方法返回值
     */
    public static Object invokeMethod(String packageName,String methodName,Class<?>[] paramTypes,Object... params){
        try{
            // 获取 Class 对象
            Class<?> clazz = Class.forName(packageName);
            // 获取构造对象
            Constructor<?> constructor = clazz.getConstructor();
            // 实例化对象
            Object object = constructor.newInstance();
            // 获取方法对象
            Method method = clazz.getMethod(methodName, paramTypes);
            // 调用方法
            return method.invoke(object, params);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

}
